package work.base.util;


import work.entity.User;

import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

/**
 * java8的 java.util.Optional 类(包装类) 使用 解决空指针问题
 *
 */
public class OptionalTest {
    public static void main(String[] args) {

        // empty()方法返回的始终是同一个对象, 所以Optional的空对象(里面的value是null)可以使用 == 比较
        Optional<String> emptyOpt = Optional.empty();
        User user = new User("aa", "shen", "123");
        Optional<User> userOptional = Optional.ofNullable(user);

        // 1
        System.out.println("空的optional:" + emptyOpt);

        // 2
        System.out.println("有值的optional:" + userOptional.get());

        // 3 orElse() 如果调用对象包含值, 返回该值, 否则返回方法的默认值
        Object emptyMsg = emptyOpt.orElse("optional为空显示哦");
        System.out.println(emptyMsg);

        // 4 orElseGet用法和 orElse()类似, 但是默认值支持lambda表达式
        Object emptyVal = emptyOpt.orElseGet(() -> {
            int num = 1;
            int sum = num + 100;
            return String.valueOf(sum);
        });
        System.out.println(emptyVal);

        // 5 flatMap()参数是lambda表达式, 这个lambda表达式的返回值必须是Optional类型
        //   map()对应的lambda表达式的返回值可以是任何类型T, map()方法返回之前会包装为 Optional
        //   map()和flatMap()的返回值都是Optional类型, 空Optional调用map()返回的还是空Optional
        Optional<String> opt2 = userOptional.flatMap((User p) -> Optional.of(p.getName()));
        Optional<String> opt3 = userOptional.map(User::getName);
        Optional<String> opt4 = emptyOpt.map(item -> "AAAA");

        // 6 ifPresent() 如果Optional的值存在则使用该值调用Consumer接口
        opt2.ifPresent((aa) -> {
            System.out.println("ifPresent : " + aa);
        });

    }
}
